home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
select
/
select.006
< prev
next >
Wrap
Text File
|
1995-02-07
|
5KB
|
223 lines
/*
r.m=80 tab=4
=======================================================================
== <<バッチ分岐支援プログラム>> ==
== [ select.exe ] Ver 0.06 ==
== 1995 Program : Y.Gotoh ==
=======================================================================
*/
/*外部ファイル読み込み */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include "gotoh.h"
/* グローバル変数の設定 */
char *sel[20]; /* select群で使用 */
int end_echo=1; /* エンディングエコーの表示非表示。初期(1)は表示 */
/* 関数の定義 */
void waitkey( int wait_time);
int select(int sel_max);
void select_list(int sel_max);
void select_prt(int sel_no,int sel_bak);
/* メイン */
int main(int argc , char *argv[])
{
int ret,sel_max,i,j;
txt_cls();
txt_csloff();
locate(20,1);
txt_color(3);
printf( "------------------------------------------\n");
locate(20,2);
printf( " [select,exe] 1995 program : Y.Gotoh \n");
locate(20,3);
printf( "------------------------------------------\n");
txt_color(7);
if(
argc <= 2
|| ( (*argv[1]=='-' || *argv[1]=='/')
&& (*(argv[1]+1)=='h' || *(argv[1]+1)=='H') )
) /* パラメータ無しまたは選択肢が */
/* 1つも無いもしくは/hオプショ */
/* ンが有る時はヘルプを表示 */
{
printf(
" \"select.exe\" Ver 0.06 1995 : Y.Gotoh (Gori)\n"
"\n"
" select.exe [option] title sel_1 sel_b sel_c ・・・\n"
" /h -h ・・・ Help ヘルプを表示します.\n"
" /e -e ・・・ not Eending echo 終了時メッセージを表示しません.\n"
"\n"
" ==メニューの使い方==\n"
" [↑],[F],[f] ・・・・・・・・・・ カーソルを上へ移動\n"
" [↓],[J],[j] ・・・・・・・・・・ 〃 下 〃 \n"
" [ret],[space] ・・・・・・・・・・ 決定\n"
" [0~9] ・・・・・・・・・・ その番号のメニューを実行\n"
" [esc],[Q],[q] ・・・・・・・・・・ 終了\n\n"
);
exit(0);
}
sel_max=argc-2; /* sel_maxに選択肢の仮の
個数を代入 */
/* 第1パラメータのタイトル・パラメータ識別 */
if( (*argv[1]=='-' || *argv[1]=='/')
&& (*(argv[1]+1)=='e' || *(argv[1]+1)=='E') )
{
end_echo=0; /* エンディングエコーを表示しない */
sel_max--; /* パラメータの分選択肢の数を減らす */
for(i=0;i<=sel_max;i++)
{ /* パラメータ分ずらした */
sel[i]=argv[i+2]; /* 配列の複写 */
}
}
else
{
for(i=0;i<=sel_max;i++)
{
sel[i]=argv[i+1]; /* 配列の複写 */
}
}
for(i=0;i<=sel_max;i++)
{
for(j=0;j<strlen(sel[i]);j++) /* アンダーバーをス */
{ /* ペースに変換する。 */
if( *(sel[i]+j)=='_' )
{
*(sel[i]+j)=' ';
}
}
}
ret=select(sel_max); /* 選択ルーチンへ */
if(ret==-1) ret=0; /* エスケープ終了は通常終了にする */
txt_cls();
if(end_echo) /* end_echo が 0 以外ならメッセージ表示 */
{
printf( "[select.exe] Ver 0.06 program : Y.Gotoh\n"
" returned error level [%d]\n",ret);
}
txt_cslon();
exit(ret);
}
/* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
int select(int sel_max)
{
int sel_no=1,sel_bak=1,ret=0;
char key='\0'; /* とりあえずループさせるために */
locate(20,5);
printf("%s\n",sel[0]); /* メニュータイトル表示 */
select_list(sel_max); /* 一覧表示 */
select_prt(sel_no,sel_bak); /* 初期位置(1)にカーソルを持ってくる */
do
{
key=getch();
key=tolower(key);
/* [↑,F,f]の時 */
if(key=='\x1e' || key=='\x66')
{
sel_bak=sel_no;
sel_no--;
if(sel_no<1) sel_no=sel_max;
select_prt(sel_no,sel_bak);
}
/* [↓,J,j]の時 */
if(key == '\x1f' || key=='\x6a')
{
sel_bak=sel_no;
sel_no++;
if(sel_no>sel_max) sel_no=1;
select_prt(sel_no,sel_bak);
}
/* 各数字(0~9)が押された時 */
if(key >= '\x30' && key <= '\x39')
{
sel_bak=sel_no;
sel_no=(int)key-0x30;
if(sel_no==0) sel_no=10;
if(sel_no>sel_max)
{
sel_no=sel_bak;
}
else
{
select_prt(sel_no,sel_bak);
waitkey(20);
key='\x0d';
}
}
}while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
if(key == '\x0d' || key == '\x20' ) ret=sel_no; /* [space],[ret]なら
選択番号を返す */
if(key == '\x71') ret=0; /* [Q],[q]なら終了(ret=0) */
if(key == '\x1b') ret=-1; /* [esc]なら-1を返す */
return(ret);
}
/* 選択肢一覧表示 */
void select_list(int sel_max)
{
int i;
for(i=1;i<=sel_max;i++)
{
locate(19,i+6);
if(i<10) printf("%1d: %s",i,sel[i]);
else printf("%d: %s",i-10,sel[i]); /* 10は、0と表示する */
}
}
/* 選択カーソル表示ルーチン */
void select_prt(int sel_no,int sel_bak)
{
locate(19,sel_bak+6); /* 黄色の帯を消す */
if(sel_bak<10){
printf("%1d: %s",sel_bak,sel[sel_bak]);
}
else printf("%1d: %s",sel_bak-10,sel[sel_bak]); /* 10は0に */
locate(19,sel_no+6); /* 新しく帯を引く */
if(sel_no<10){
printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no,sel[sel_no]);
}
else printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no-10,sel[sel_no]);
}
/* サブルーチン */
/* 何かキーを押すか一定時間経つと処理を復帰するサブ */
void waitkey(int wait_time)
{
int i=0;
for(i=0;i<wait_time*10;i++)
{
if( kbhit() != 0) break;
}
}